.MODEL small
.STACK 200h
.DATA
	_error_overflow_double   DB   'Runtime Error : double Overflow$'
	_error_underflow_double  DB   'Runtime Error : double Underflow$'
	_error_overflow_int      DB   'Runtime Error : integer Overflow$'
	_error_underflow_int     DB   'Runtime Error : integer Underflow$'
	_error_div_by_zero       DB   'Runtime Error : Division by ZERO!!!$'
	_warninig_double         DB   'Runtime warning : double Value Trimmed$'
	maxdouble                DQ   1.7976931348623157e308
	mindouble                DQ   2.2250738585072014e-308
	maxint                   DW   32767
	minint                   DW  -32768
	FlagVar                  DW   ?
	varauxDouble             DQ   ?
	varauxInt                DW   ?
	_STR_1731777576 DB 'A es mayor que B$'
	_STR_582451597 DB 'C vale -10$'
	_c DW ?
	_b DW ?
	_a DW ?
	_STR_2085905584 DB 'A es mayor que B+C$'
	_STR_2023820371 DB 'TODO FUNCIONA BIEN MAN!!!!$'
	_CTE_2_5 DQ 2.5
	_x DQ ?
	_STR_214917004 DB 'C es mayor que B+A$'

.CODE

	;PROCEDIMIENTO OVERFLOW DOUBLE
	doubleoverflow proc 
		jo error_doubleoverflow 
		ret 
	doubleoverflow endp 


	;PROCEDIMIENTO UNDERFLOW DOUBLE
	doubleunderflow proc 
		jo error_doubleunderflow 
		ret 
	doubleunderflow endp 


	;PROCEDIMIENTO OVERFLOW INT
	intoverflow proc 
		jo error_intoverflow 
		ret 
	intoverflow endp 


	;PROCEDIMIENTO UNDERFLOW INT
	intunderflow proc 
		jo error_intunderflow 
		ret 
	intunderflow endp 


	;PROCEDIMIENTO DIVISION POR CERO
	zerodiv proc 
		jz error_zerodiv 
		ret
	zerodiv endp


	;PROCEDIMIENTO PRINT
	print proc
		mov ah,09h
		int 21h
		ret
	print endp 


	warning_asig proc 
		mov dx,offset _warninig_double
		call print 
		ret
	warning_asig endp


	error_doubleoverflow:
		mov dx,offset _error_overflow_double 
		call print
		mov al,1h 
		jmp SYSCALL_END

	error_doubleunderflow:
		mov dx,offset _error_underflow_double 
		call print
		mov al,2h 
		jmp SYSCALL_END

	error_intoverflow:
		mov dx,offset _error_overflow_int 
		call print
		mov al,3h 
		jmp SYSCALL_END

	error_intunderflow:
		mov dx,offset _error_underflow_int 
		call print
		mov al,4h 
		jmp SYSCALL_END

	error_zerodiv:
		mov dx,offset _error_div_by_zero 
		call print
		mov al,5h 
		jmp SYSCALL_END

	START:
		mov ax,@data 
		mov ds,AX 
		finit
		fclex

	;--------------Comienzo de tercetos--------------


	;IL(0)=(ASSIGN,_x,_CTE_2_5)
	; Comienzo de Asignacion
		fld _CTE_2_5
		fstp _x
	; Fin de Asignacion


	;IL(1)=(ASSIGN,_a,1)
	; Comienzo de Asignacion
		mov _a , 1
	; Fin de Asignacion


	;IL(2)=(ASSIGN,_b,3)
	; Comienzo de Asignacion
		mov _b , 3
	; Fin de Asignacion


	;IL(3)=(ASSIGN,_c,5)
	; Comienzo de Asignacion
		mov _c , 5
	; Fin de Asignacion


	;IL(4)=(GREATER,_a,_b)
	; Comienzo de comparacion
		mov ax,_a
		cmp ax,_b
	; Fin de comparacion


	;IL(5)=(BF,IL(8),IL(4))
	; Comienzo de Branch por falso
	jle L_8
	; Fin de branch por falso


	;IL(6)=(PRINT,_STR_1731777576)
	; Comienzo de impresion
		MOV DX, offset  _STR_1731777576
		call print
	; Fin de impresion


	;IL(7)=(BR,IL(12))
	; Comienzo de Branch incondicional
	jmp L_12
	; Fin de branch incondicional

L_8: 
	;IL(8)=(ADD,_b,_c)
	; Comienzo de Suma
		mov BX , _b
		add BX , _c
	; Fin de Suma


	;IL(9)=(GREATER,_a,IL(8))
	; Comienzo de comparacion
		mov ax,_a
		cmp ax,BX
	; Fin de comparacion


	;IL(10)=(BF,IL(12),IL(9))
	; Comienzo de Branch por falso
	jle L_12
	; Fin de branch por falso


	;IL(11)=(PRINT,_STR_2085905584)
	; Comienzo de impresion
		MOV DX, offset  _STR_2085905584
		call print
	; Fin de impresion

L_12: 
	;IL(12)=(ADD,_b,_a)
	; Comienzo de Suma
		mov CX , _b
		add CX , _a
	; Fin de Suma


	;IL(13)=(GREATER,_c,IL(12))
	; Comienzo de comparacion
		mov ax,_c
		cmp ax,CX
	; Fin de comparacion


	;IL(14)=(BF,IL(16),IL(13))
	; Comienzo de Branch por falso
	jle L_16
	; Fin de branch por falso


	;IL(15)=(PRINT,_STR_214917004)
	; Comienzo de impresion
		MOV DX, offset  _STR_214917004
		call print
	; Fin de impresion

L_16: 
	;IL(16)=(UNARY_SUB,10)
	; Comienzo de Resta unaria
		mov BX , 0
		sub BX , 10
	; Fin de Resta unaria


	;IL(17)=(ASSIGN,_c,IL(16))
	; Comienzo de Asignacion
		mov _c , BX
	; Fin de Asignacion


	;IL(18)=(UNARY_SUB,10)
	; Comienzo de Resta unaria
		mov CX , 0
		sub CX , 10
	; Fin de Resta unaria


	;IL(19)=(EQ,_c,IL(18))
	; Comienzo de comparacion
		mov ax,_c
		cmp ax,CX
	; Fin de comparacion


	;IL(20)=(BF,IL(22),IL(19))
	; Comienzo de Branch por falso
	jne L_22
	; Fin de branch por falso


	;IL(21)=(PRINT,_STR_582451597)
	; Comienzo de impresion
		MOV DX, offset  _STR_582451597
		call print
	; Fin de impresion

L_22: 
	;IL(22)=(SUB,_a,_b)
	; Comienzo de Resta
		mov BX , _a
		sub BX , _b
	; Fin de Resta


	;IL(23)=(DIV,2,_a)
	; Comienzo de Division
		 mov DX , 0
		 mov AX , 2
		 mov CX , _a
		 cmp CX,0
		 call zerodiv
		 idiv CX
		 mov CX , AX 
	; Fin de Division


	;IL(24)=(ADD,IL(22),IL(23))
	; Comienzo de Suma
		add BX , CX
	; Fin de Suma


	;IL(25)=(ADD,IL(24),10)
	; Comienzo de Suma
		add BX , 10
	; Fin de Suma


	;IL(26)=(MULT,IL(25),2)
	; Comienzo de Mult
		mov AX , BX
		mov CX , 2
		mov DX, 0
		imul CX
		mov CX, AX
	; Fin de Suma


	;IL(27)=(ASSIGN,_c,IL(26))
	; Comienzo de Asignacion
		mov _c , CX
	; Fin de Asignacion


	;IL(28)=(EQ,_c,20)
	; Comienzo de comparacion
		mov ax,_c
		cmp ax,20
	; Fin de comparacion


	;IL(29)=(BF,IL(31),IL(28))
	; Comienzo de Branch por falso
	jne L_31
	; Fin de branch por falso


	;IL(30)=(PRINT,_STR_2023820371)
	; Comienzo de impresion
		MOV DX, offset  _STR_2023820371
		call print
	; Fin de impresion

L_31: 
	;IL(31)=(END_PROG)
	; Comienzo del Fin de Programa
	NORMAL_END :
		mov al, 00h
	SYSCALL_END:
		mov ah, 4Ch
		int 21h
	END START
	; Fin de Fin de Programa

	;--------------Fin de tercetos--------------
